/**
 * api/users
 */

const defaultToInteger = require('../../../utils/default-to-integer');
const sortQB = require('../../../utils/sort-qb')();
const md5 = require('../../../utils/md5');


module.exports = function(app) {
    const router = app.router;
    const User = app.models.User;
    const Role = app.models.Role;

    /**
     * @apiVersion 1.0.0
     * @apiGroup User
     * @api {get} /users 获取角色列表
     * @apiParam {Number} status=ONLINE 上架状态 `0:OFFLINE, 1:ONLINE, 2:DEBUG`
     * @apiParam {Number} locate=home 角色位置 `home, post, user, home_user: 首页横幅`
     * @apiParam {Number} type=image 角色类型 `image, video`
     * @apiParam {Number} since 指定时间，单位秒
     * @apiParam {Number} page_size=20 分页大小
     * @apiParam {Number} page_num=1 页码
     * @apiParam {String} sort=priority-desc 排序，支持 `id-desc, id-asc, priority-desc`
     *
     * @apiParam {Number} status=1 `0:OFFLINE, 1:ONLINE, 2:DEBUG` 上架状态
     * @apiParam {Number} title 标题
     * @apiParam {String} locate 角色位置
     * @apiParam {String} scope 角色范围
     * @apiParam {String} scope_info 角色范围配置
     * @apiParam {String} type 角色类型 ``
     * @apiParam {String} asset_url 资源 URL
     * @apiParam {Number} width 宽
     * @apiParam {Number} height 高
     * @apiParam {Number} duration 角色时长，单位毫秒
     * @apiParam {String} url 跳转URL `如果为空则不跳转，其余按 H5内 `openPage.url` 和 全局规则`
     * @apiParam {Number} priority 排序优先级
     * @apiParam {Number} start_time 开始时间，单位秒
     * @apiParam {Number} end_time 结束时间，单位秒
     *
     * @apiSuccess {Number} status 上架状态
     * @apiSuccess {String} locate 角色位置 `home: user: recommed: 推荐位`
     * @apiSuccess {String} scope 角色范围
     * @apiSuccess {String} scope_info 角色范围配置
     * @apiSuccess {String} type 角色类型
     * @apiSuccess {String} asset_url 资源 URL
     * @apiSuccess {Number} width 宽
     * @apiSuccess {Number} height 高
     * @apiSuccess {Number} duration 角色时长，单位毫秒
     * @apiSuccess {String} url 跳转 URL `如果为空则不跳转，其余按 H5内 `openPage.url` 和 全局规则`
     ** @apiSuccess {Number} params 请求参数
     * @apiSuccess {Number} priority 排序优先级
     * @apiSuccess {Number} start_time 开始时间，单位秒
     * @apiSuccess {Number} end_time 结束时间，单位秒
     *
     * @apiSampleRequest
     */
    router.get('/users', function *() {
        const query = this.query;

        // @TODO: 支持 scpoe 查询
        const users = yield User.query(qb => {
            qb.where('deleted', User.NOT_DELETED);
            if(query.role_id && +query.role_id > 0) {
                qb.where('role_id', query.role_id);
            }
            if(query.department_id && +query.department_id > 0) {
                qb.where('department_id', query.department_id);
            }
            if(query.name) {
                qb.where('name', 'like', '%' + query.name + '%');
            }
            // sort
            // sortQB(qb, query.sort);
        })
        .fetchItems({
            page_size: query.page_size,
            page_num: query.page_num
        }, {
            withRelated: ['role']
        });

        this.body = users;
    });

    router.get('/users/:id', function *() {
        this.body = yield User.where({
            id: this.params.id
        })
        .fetch({
            require: true
        });
    });

    /**
     * @apiVersion 1.0.0
     * @apiGroup User
     * @api {post} /users 新建角色
     *
     * @apiParam {Number} status 上架状态
     * @apiParam {String} locate 角色位置
     * @apiParam {String} scope 角色范围
     * @apiParam {String} scope_info 角色范围配置
     * @apiParam {String} type 角色类型
     * @apiParam {String} asset_url 资源 URL
     * @apiParam {Number} width 宽
     * @apiParam {Number} height 高
     * @apiParam {Number} duration 角色时长，单位毫秒
     * @apiParam {String} url 跳转 URL，如果为空则不跳转，其余按 H5内 `openPage.url` 规则
     * @apiParam {Number} priority 排序优先级
     * @apiParam {Number} start_time 开始时间，单位秒
     * @apiParam {Number} end_time 结束时间，单位秒
     */
    router.post('/users', function *() {
        let body = this.request.body;

        const check = yield User.query(qb => {
            qb.where('name', body.name);
            qb.where('deleted', User.NOT_DELETED);
        })
        .fetch();

        if(check) {
            this.throw(400, '该用户已存在');
        }
        if(body.pwd) {
            body.pwd = md5(body.pwd);
        }

        const users = yield User.where({
            role_id: body.role_id
        })
        .fetchAll();

        const role = yield Role.where({
            id: body.role_id
        })
        .fetch();

        body.account = role.get('code') + (1000 + users.length);
        let user = User.safeForge(body);

        this.body = yield user.save();
    });

    /**
     * @apiVersion 1.0.0
     * @apiGroup User
     * @api {put} /users/:id 修改角色
     *
     * @apiParam {Number} status 上架状态
     * @apiParam {String} locate 角色位置
     * @apiParam {String} scope 角色范围
     * @apiParam {String} scope_info 角色范围配置
     * @apiParam {String} type 角色类型 ``
     * @apiParam {String} recommend_type `home_recommend: 首页顶部推荐, feature_recommend: 特性（标签）推荐, templet_recommend 模板库推荐`
     * @apiParam {String} asset_url 资源 URL
     * @apiParam {Number} width 宽
     * @apiParam {Number} height 高
     * @apiParam {Number} duration 角色时长，单位毫秒
     * @apiParam {String} url 跳转URL `如果为空则不跳转，其余按 H5内 `openPage.url` 和 全局规则`
     * @apiParam {Number} priority 排序优先级
     * @apiParam {Number} start_time 开始时间，单位秒
     * @apiParam {Number} end_time 结束时间，单位秒
     *
     * @apiSuccess {Number} status 上架状态
     * @apiSuccess {String} locate 角色位置 `home: user: recommed: 推荐位`
     * @apiSuccess {String} scope 角色范围
     * @apiSuccess {String} scope_info 角色范围配置
     * @apiSuccess {String} type 角色类型
     * @apiSuccess {String} asset_url 资源 URL
     * @apiSuccess {Number} width 宽
     * @apiSuccess {Number} height 高
     * @apiSuccess {Number} duration 角色时长，单位毫秒
     * @apiSuccess {String} url 跳转 URL `如果为空则不跳转，其余按 H5内 `openPage.url` 和 全局规则`
     * @apiSuccess {Number} priority 排序优先级
     * @apiSuccess {Number} start_time 开始时间，单位秒
     * @apiSuccess {Number} end_time 结束时间，单位秒
     */
    router.put('/users/:id', function *() {
        const body = this.request.body;
        let user = yield User.where({
            id: this.params.id
        })
        .fetch({
            require: true
        });

        delete body.role;

        const check = yield User.query(qb => {
            qb.where('name', body.name);
            qb.where('deleted', User.NOT_DELETED);
        })
        .fetch();

        if(check && user.get('id') !== +this.params.id) {
            this.throw(400, '该用户已存在');
        }
        if(body.pwd) {
            body.pwd = md5(body.pwd);
        }
        else {
            delete body.pwd;
        }
        user.safeSet(body);

        yield user.save();

        this.body = user;
    });

    /**
     * @apiVersion 1.0.0
     * @apiGroup User
     * @api {delete} /users/:id 删除角色
     */
    router.delete('/users/:id', function *() {
        let user = yield User.where({
            id: this.params.id
        })
        .fetch({
            require: true
        });

        user.set('deleted', User.DELETED);

        yield user.save();

        this.body = this.params;
    });

    router.post('/users/session', function() {

    });
};
